2008年01月17日
川俣晶の縁側ソフトウェア技術雑記 total 9826 count

デリゲートを使って行うC# 3.0におけるusingよりももっと冴えた確実なリソース開放の書き方?

Written By: 川俣 晶連絡先

 久々に、スムーズにコードが書けるコンディションが戻ってきた感じです。

 やはり、気持ち良くコードが書けると、気分も晴れやかです。

 というわけで、ふと思い付いたこと。

C#の素晴らしいusing文 §

 C#のusing文を使うと確実なリソースの開放(ファイルのクローズ等)を容易に記述できます。

 try-finally構文よりもずっと優れています。

using (TextWriter writer = File.CreateText(@"s:\delme1.txt"))

{

    writer.WriteLine("やっほー");

}

 しかし、using文を書かなければどうにもなりません。

デリゲートを使った改善 §

 C# 3.0時代なら、こんなラッパメソッドを用意して。

public class TextFileWriteWrapper

{

    public static void WriteFile( string filenane,

                                 Action<TextWriter> invoker )

    {

        using (TextWriter writer = File.CreateText(filenane))

        {

            invoker(writer);

        }

    }

}

 これを使って、以下のような感じに書いても良いかなと。

TextFileWriteWrapper.WriteFile(@"s:\delme2.txt",writer => {

    writer.WriteLine("やっほー");

});

 これなら、メソッドさえ呼び出していればクローズは確実。using忘れはあり得ないわけです。

 しかも、File.WriteAllLinesのような配列を準備する手間も要りません。

 その上、タイプする文字数も減ります。このままでも短いですが、名前を工夫すればもっと短くて良いでしょう。